"""
中间件：
中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前，我们可以使用中间件来做一些相关的事情，比如
可以判断当前这个用户有没有登录，
如果登录了，就绑定一个user对象到request上。也可以在response到达浏览器之前，做一些相关的处理，
比如想要统一在response上设置一些cookie信息等。
"""
from .models import User


# TODO: 1.使用函数函数创建中间件
def front_user_middleware(get_response):
    print('1.进入front_user_middleware中间件仅项目启动时执行1次')

    def middleware(request):
        print('2.request到达view之前执行。。。')
        user_id = request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
                request.frontuser = user
            except:
                request.frontuser = None
        else:
            request.frontuser = None

        response = get_response(request)
        print('4.response开始响应到客户端之前执行...')
        if request.frontuser:
            # TODO: 记录当前用户登录状态
            response.set_cookie('islogin', True, max_age=86400, httponly=True)
        else:
            # TODO: 删除当前用户登录状态
            response.delete_cookie('islogin')
        return response

    return middleware


# TODO: 2.使用类的中间件
class FrontUserMiddleware(object):
    def __init__(self, get_response=None):
        print('1.进入FrontUserMiddleware类中间件仅项目启动时执行1次')
        self.get_response = get_response

    def __call__(self, request):
        print('2.request到达view之前执行。。。')
        user_id = request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
                request.frontuser = user
            except:
                request.frontuser = None
        else:
            request.frontuser = None

        response = self.get_response(request)
        print('4.response开始响应到客户端之前执行...')
        if request.frontuser:
            # TODO: 记录当前用户登录状态
            response.set_cookie('islogin', True, max_age=86400, httponly=True)
        else:
            # TODO: 删除当前用户登录状态
            response.delete_cookie('islogin')
        return response
